package fun.eliauk.shuatiba.config;

import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import fun.eliauk.shuatiba.utils.BlackIpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.concurrent.Executor;

@Component
@Slf4j
public class NacosListener implements InitializingBean {

    @NacosInjected
    private ConfigService configService;

    @Value("${nacos.config.data-id}")
    private String dataId;

    @Value("${nacos.config.group}")
    private String group;

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("Nacos 监听器启动");
        String config = configService.getConfigAndSignListener(dataId, group, 3000L, new Listener() {
            // 线程池，返回 null 也会有默认的线程池
            @Override
            public Executor getExecutor() {
                return null;
            }

            // 监听到 naocs 的配置有改动需要做的操作在这写
            // （Nacos 配置文件的监听的粒度比较粗，只能知晓配置有变更，
            // 无法知晓是新增、删除还是修改，所以每当有修改的时候我们都是去重建）
            // 这里 String s 就代表着 nacos 配置文件内容
            @Override
            public void receiveConfigInfo(String config) {
                log.info("Nacos 监听器 监听到配置文件有改动");
                BlackIpUtils.rebuildBlackIp(config);
                log.info("Ip 黑名单相关配置已重新读取");
            }
        });

        // 初始化黑名单
        BlackIpUtils.rebuildBlackIp(config);
    }
}
